package com.guw.TestThread;

//lambda表达式
//避免匿名内部类定义过多,可以让代码看起来简洁,只留下核心逻辑,其实质属于函数式编程的概念
//函数式接口Functional Interface:任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口
//对于函数式接口,我们可以通过lambda表达式来创建该接口的对象,例如Runnable,只含run()方法;
public class TestLambda {
    //第三步,定义一个静态内部类
    static class Like2 implements ILike {
        @Override
        public void lambda() {
            System.out.println("I like lambda2!");
        }
    }

    public static void main(String[] args) {
        ILike Like = new Like();
        Like.lambda();

        ILike like2 = new Like2();
        like2.lambda();

        //第四步,局部内部类
        class Like3 implements ILike {
            @Override
            public void lambda() {
                System.out.println("I like lambda3!");
            }
        }

        ILike like3 = new Like3();
        like3.lambda();

        //第五步,匿名内部类
        ILike like4 = new Like() {
            @Override
            public void lambda() {
                System.out.println("I like lambda4!");
            }
        };
        like4.lambda();

        //第六步,lambda简化,必须是函数式接口,只保留核心代码,去掉了接口名和方法名;
        //如果方法体只有一行代码,可以简化去掉{};如果多行还是需要代码块包裹;
        //多个参数也可以去掉参数类型,但需要用小括号;
        ILike like5 = () ->
            System.out.println("I like lambda5!");

        like5.lambda();
    }
}

//lambda表达式推导:
//第一步:定义一个函数式接口
interface ILike {
    void lambda();
}

//第二步,定义一个实现类
class Like implements ILike {
    @Override
    public void lambda() {
        System.out.println("I like lambda!");
    }
}